package com.teamview.service;

import com.teamview.domain.Architect;
import com.teamview.domain.Designer;
import com.teamview.domain.Employee;
import com.teamview.domain.Programmer;

/**
 * @author Lenl
 * @create 2021-06-02 8:58
 * @Description 关于开发团队成员的管理，添加、删除等
 */
public class TeamService {
    //为开发团队成员提供唯一id
    private static int counter=1;
    //限制开发团队的人数
    private final int MAX_MEMBER=5;
    //保存开发团队成员
    private Programmer[] team=new Programmer[MAX_MEMBER];
    //记录开发团队中实际人数
    private int total=0;

    /**
     * @Description 获取开发团队中的所有成员
     * @return 所有成员的数组
     */
    public Programmer[] getTeam(){

        Programmer[] programmers=new Programmer[total];
        for (int i=0;i<programmers.length;i++){
            programmers[i]= team[i];
        }
        return programmers;
    }

    /**
     * @Description 将指定员工添加到开发团队中
     * @param e 待添加的员工
     */
    public void addMember(Employee e) throws TeamException{
        //成员已满，无法添加
        if(total>=MAX_MEMBER){
            throw new TeamException("成员已满，无法添加！");
        }
        //该成员不是开发成员，无法添加
        if(!(e instanceof  Programmer)){
            throw new TeamException("该成员不是开发成员，无法添加！");
        }
        //该员工已在开发团队中
        if(isExist(e)){
            throw new TeamException("该员工已在开发团队中！");
        }
        //该员工已是某团队成员
        Programmer p=(Programmer)e;
        /* 改成枚举类了
        if("BUSY".equals(((Programmer) e).getStatus().getNAME())){
            throw new TeamException("该员工已是某团队成员！");
        }else if("VACATION".equals(((Programmer) e).getStatus().getNAME())){
            throw new TeamException("该员工正在休假！");
        }
         */
        switch(p.getStatus()){
            case BUSY -> throw new TeamException("该成员已是某团队成员！");
            case VACATION -> throw new TeamException("该员工正在休假，无法添加！");
        }
        //团队中至多能有一名架构师，两名设计师，三名程序员
        //获取team已有成员中的架构师、设计师、程序员的人数
        int numOfArch=0,numOfDes=0,numOfPro=0;
        for (int i=0;i<total;i++){
            if(team[i] instanceof Architect){
                numOfArch++;
            }else if(team[i] instanceof Designer){
                numOfDes++;
            }else numOfPro++;
        }

        if(p instanceof Architect){
            if(numOfArch>=1){
                throw new TeamException("团队中至多只能有一名架构师！");
            }else if(p instanceof Designer){
                if(numOfDes>=2){
                    throw new TeamException("团队中至多只能有两名设计师！");
                }
            }else if(p instanceof Programmer){
                if(numOfPro>=3){
                    throw new TeamException("团队中至多只能有三名程序员！");
                }
            }
        }
        //e的属性赋值
        p.setStatus(Status.BUSY);
        p.setMemberId(counter++);
        //将e添加到现有team中
        team[total++]=p;

    }

    /**
     * 已成团队成员
     * @param id 用于删除的memberid
     */
    public void removeMember(int id) throws TeamException{

        int i;
        for ( i=0;i<total;i++){
            if(team[i].getMemberId()==id){
                team[i].setStatus(Status.FREE);
                break;
            }
        }
        if(i==total){
            //证明没有找到指定的员工
            throw new TeamException("未找到指定的员工，删除失败！");
        }
        //后一元素覆盖前一元素
        for (int j=i+1;j<total;j++){
            team[j-1]=team[j];
        }
        team[--total]=null;

    }

    /**
     * @Description 判断指定员工是否在开发团队中
     * @param e
     * @return
     */
    private boolean isExist(Employee e){
        for (int i=0;i<total;i++){
            if(team[i].getId()==e.getId()){
                return  true;
            }
        }
        return false;
    }
}
